Conceitos de Docker
Tempo estimado de leitura: 6min
Dockerfile
O Dockerfile provê instruções de como se construir a imagem de um container (usando o comando docker build -t <nome_dessa_img> <caminho_do_dockerfile>
). Começa a partir de alguma imagem Base (usando o comando FROM
), seguido de quaisquer outras instruçoes necessárias
Então, a gente "compila" esse código, tendo como resultado uma imagem que poderemos interagir com.
principais comandos
Comando | Descrição | Uso |
---|---|---|
ARG |
Define uma variavel que o usuário pode passar ao buildar a imagem (usando a flag --build-arg essa variável só fica disponivel nas etapas de build da imagem (ou seja, só no dockerfile, mas nao no container) nao use isso pra passar 'segredos' já que os valores podem ser acessados usando |
ˢᶦⁿᵗᵃˣᵉ ↴
ᵉˣᵉᵐᵖˡᵒ ↴
como se usaria:
|
ENV |
Define uma variavel de ambiente que será utilizada tanto em build-time como em run-time (ou seja, os containers em execução também possuem essa ENV definida). O usuário pode passar o valor utilizando a flag --env ou -e nao use ENV caso so precise do valor em build-time |
ˢᶦⁿᵗᵃˣᵉ ↴
ᵉˣᵉᵐᵖˡᵒ ↴
como se usaria:
|
FROM |
especifica a imagem base que será utilizada primeiro busca-se essa imagem localmente, caso nao encontre, busca-se no dockerhub o repositorio mais adequado |
ˢᶦⁿᵗᵃˣᵉ ↴
ᵉˣᵉᵐᵖˡᵒˢ ↴ padrão
usando imagem de outro registry (ECR da AWS)
recebendo plataformas da cli como
ARG
|
LABEL |
adiciona metadados a imagem. é feito através de pares de key-value (criados por você mesmo) isso pode ser, então, verificado com o comando docker inspect |
ˢᶦⁿᵗᵃˣᵉ ↴
ᵉˣᵉᵐᵖˡᵒ ↴
|
WORKDIR |
define qual será o diretorio de trabalho em build-time (o caminho relativo de qualquer comando RUN , CMD , ENTRYPOINT , COPY e ADD será esse diretório);caso o diretório não exista, este será criado caso passe um caminho relativo (não-absoluto), este será usado em relação ao ultimo WORKDIR definido |
ˢᶦⁿᵗᵃˣᵉ ↴
ᵉˣᵉᵐᵖˡᵒ ↴
o resultado seria: . |
USER |
configura qual será o usuário (opcionalmente o grupo, também [caso não especifique, será root]) que será utilizado dali em diante (tanto em build-time como run-time)o usuário tem que ser criado por você previamente no dockerfile |
ˢᶦⁿᵗᵃˣᵉ ↴
ᵉˣᵉᵐᵖˡᵒ ↴
|
COPY |
copia arquivos/diretorios do Host (em relação ao contexto da build) para o Container (em relação ao pode-se utilizar wildcards nos caminhos advindos do host:
|
ˢᶦⁿᵗᵃˣᵉ ↴
A versão com ᵉˣᵉᵐᵖˡᵒ ↴
|
ADD |
O mesmo que o
|
ˢᶦⁿᵗᵃˣᵉ ↴
ᵉˣᵉᵐᵖˡᵒ ↴
|
CMD |
Provê algum padrão pro container em execução
|
ˢᶦⁿᵗᵃˣᵉ ↴
ᵉˣᵉᵐᵖˡᵒ ↴
|
ENTRYPOINT |
permite configurar um container pra ser rodado como um executavel |
ˢᶦⁿᵗᵃˣᵉ ↴
ᵉˣᵉᵐᵖˡᵒ ↴
|
BuildKit - Segredos
No Windows/Mac, BuildKit já é utilizado por padrão; no Linux, não. Para saber como ativar, leia aqui
Caso queira, o comando abaixo verifica se o arquivo de configurações personalizadas já existe e, caso nao exista, cria o mesmo já especificando o uso do Buildkit:
$ test -f /etc/docker/daemon.json || (echo '{ "features": { "buildkit": true } }' | sudo tee /etc/docker/daemon.json)
~~ dar exemplo com segredo do Github, JWT ou bCrypt etc
otimizando build
docker layered cache
Only the instructions RUN, COPY, ADD create layers. Other instructions create temporary intermediate images, and do not increase the size of the build.
Docker cacheia as instruções no Dockerfile
por camadas. Fazendo um paralelo com a Torre de Hanoi: pense que o Dockerfile é a torre (de cabeça pra baixo); entao, sempre que ouver alteração em alguma linha/camada, todas as peças que estão em cima são descartadas.
Por isso é tão frequente ver a seguinte estrutura em um projeto JS:
Correto | Incorreto |
---|---|
|
|
Já que o comando COPY . .
copia todos os arquivos, e o código-fonte está em constante alteração, isso significa que toda vez que fosse buildar essa imagem, haver-se-ia de descartar o comando seguinte (npm install
), resultando na re-execução desse comando.
comando onbuild
multistage build
dockerignore
volumes
docker pull
registry x repositories
https://stackoverflow.com/a/34004418/11947314